#!/usr/bin/env python3
# -*- coding: utf-8 -*-

"""
节点模块

此模块提供用于表示RRT树中节点的Node类。
"""


class Node:
    """
    表示RRT树中节点的类。
    """
    
    def __init__(self, x, y, parent=None, cost=0.0):
        """
        使用给定坐标和父节点初始化节点。
        
        参数:
            x (float): 节点的X坐标
            y (float): 节点的Y坐标
            parent (Node, optional): 父节点，根节点为None
            cost (float, optional): 从根节点到此节点的成本
        """
        self.x = x
        self.y = y
        self.parent = parent
        self.cost = cost
        self.children = []
    
    @property
    def position(self):
        """
        获取节点的位置。
        
        返回:
            tuple: 节点的(x, y)坐标
        """
        return self.x, self.y
    
    def add_child(self, child_node):
        """
        向此节点添加子节点。
        
        参数:
            child_node (Node): 要添加的子节点
        """
        self.children.append(child_node)
    
    def update_parent(self, new_parent, new_cost=None):
        """
        更新此节点的父节点（用于RRT*中的重新连接）。
        
        参数:
            new_parent (Node): 新的父节点
            new_cost (float, optional): 从根节点到此节点的新成本
        """
        # 如果存在，从旧父节点的子节点中移除此节点
        if self.parent:
            if self in self.parent.children:
                self.parent.children.remove(self)
        
        # 更新父节点引用
        self.parent = new_parent
        
        # 如果提供了新成本，则更新成本
        if new_cost is not None:
            self.cost = new_cost
        
        # 将此节点添加到新父节点的子节点中
        if new_parent:
            new_parent.add_child(self)
    
    def distance_to(self, other_node):
        """
        计算到另一个节点的欧几里得距离。
        
        参数:
            other_node (Node): 要计算距离的另一个节点
            
        返回:
            float: 节点之间的欧几里得距离
        """
        import numpy as np
        return np.sqrt((self.x - other_node.x)**2 + (self.y - other_node.y)**2)
    
    def __eq__(self, other):
        """
        检查两个节点是否具有相同位置。
        
        参数:
            other (Node): 要比较的另一个节点
            
        返回:
            bool: 如果位置相等则为True，否则为False
        """
        if not isinstance(other, Node):
            return False
        return self.x == other.x and self.y == other.y
    
    def __hash__(self):
        """
        基于节点位置的哈希函数。
        
        返回:
            int: 哈希值
        """
        return hash((self.x, self.y))
    
    def __str__(self):
        """
        节点的字符串表示。
        
        返回:
            str: 字符串表示
        """
        return f"Node(x={self.x:.2f}, y={self.y:.2f}, cost={self.cost:.2f})"
    
    def __repr__(self):
        """
        节点的详细字符串表示。
        
        返回:
            str: 详细的字符串表示
        """
        parent_pos = f"({self.parent.x:.2f}, {self.parent.y:.2f})" if self.parent else "None"
        return f"Node(x={self.x:.2f}, y={self.y:.2f}, cost={self.cost:.2f}, parent={parent_pos})" 